# cpp3ds-template-v2
An updated and more complete template to get started with cpp3ds.
Don't forget to check the [cpp3ds's documentation](http://cpp3ds.github.io/docs/annotated.htm).

### How to build
You will need at first the [cpp3ds library](https://github.com/Naxann/cpp3ds), whose location must be defined
in the environment variable CPP3DS.

To build from source on a Linux/UNIX-based system, run the following commands:

	mkdir -p build
	cd build
	cmake -DCMAKE_BUILD_TYPE=Debug -DBUILD_EMULATOR=ON -DBUILD_TESTS=ON ..
	make -j4
    
*-DCMAKE_BUILD_TYPE* can be set to either "Release" or "Debug" (without the quotes):

**Release** is the mode chosen when you are about to release/update your app, the debugging console on the bottom screen and the FPS counter on the top screen will not be drawn in this mode.

**Debug** is the mode chosen when you are developing your application, this mode will allow you to see the debugging console and the FPS counter, useful to debug your application.

### Compiled files
**3DS**: The files **[project-name].3dsx** and **[project-name].cia** are usable by the 3DS to test your application on the real hardware.

**Computer**: The file **[project-name]-emu** is usable to test your application without the needs of install the app on the 3DS.

Note: The emulator *can't* run libctru's functions.

### How to use
You can start to dev your app in the *States/DefaultState.cpp* file, some examples are in this file.

### Random help
* You can use libctru functions in your cpp3ds project, but you need to put your libctru functions between **##ifndef EMULATION** and **##endif**. Example:

```
#include <cpp3ds/Graphics/Sprite.hpp>
##ifndef EMULATION
// 3ds.h must ALWAYS be included between ifndef EMULATION too
#include <3ds.h>
##endif

RandomClass::RandomClass()
{
    // Random things
    cpp3ds::Sprite randomSprite;
    randomSprite.setPosition(5.f, 5.f);
    
    cpp3ds::Uint8 systemLanguage = 0;
##ifndef EMULATION
    // Here, the code will NOT be compiled for the emulator
    // Calling the libctru's function CFGU_GetSystemLanguage
    CFGU_GetSystemLanguage(&systemLanguage);
##endif

    // Other things
}
```

* In the *CMakeLists.txt* file, you will want to modify some values:

L7: **project("project-name")** - Enter your project name here without space or special characters

L9: **APP_TITLE** - The title of your app that will appear on the HOME Menu and on other places

L10: **APP_DESCRIPTION** - The description of your app that will appear on the HOME Menu and on other places

L11: **APP_AUTHOR** - The author(s) of your app that will appear on the HOME Menu and on other places

L15: **APP_VERSION** - The version of your app, each update of your app have to see this number incremented, checkout my [converter for Linux](https://notabug.org/arc13/titleVersionConverter)

L18: **APP_UNIQUE_ID** - The product ID of your app, must be an hexadecimal value

* You can find your app's icon, banner, banner sound and .rsf in the *res/app* directory
* You can put the assets of your app in the *res/romfs* directory
* The *res/sdmc* directory is generated by the emulator to emulate the SD card
* The generated binaries are in the *bin/* directory, when *make -j4* is executed, and the compilation is successful, this should include: A **[project-name].3dsx** and a **[project-name].cia** file for the 3DS, a **[project-name]-emu** (the emulator) and a **[project-name]-tests** file for the computer, and a [project-name].bnr, [project-name].elf and [project-name].smdh file.

### Credits
* [Cruel](https://github.com/Cruel) - For cpp3ds and it's template
* [Naxann](https://github.com/Naxann) - To keep alive [cpp3ds](https://github.com/Naxann/cpp3ds)